package pers.tz.题目.leetcode.树;

import pers.tz.common.TreeNode;
import pers.tz.common.TreeUtils;

/**
 * @author irony
 * @date 2024-03-17
 */
public class leetcode_0114_二叉树展开为链表 {
//给你二叉树的根结点 root ，请你将它展开为一个单链表：
//
// 展开后的单链表应该同样使用 TreeNode ，其中 right 子指针指向链表中下一个结点，而左子指针始终为 null 。
// 展开后的单链表应该与二叉树 先序遍历 顺序相同。
//
// 示例 1：
//输入：root = [1,2,5,3,4,null,6]
//输出：[1,null,2,null,3,null,4,null,5,null,6]
//
// 示例 2：
//输入：root = []
//输出：[]
//
// 示例 3：
//输入：root = [0]
//输出：[0]
//
// 提示：
// 树中结点数在范围 [0, 2000] 内
// -100 <= Node.val <= 100
//
// 进阶：你可以使用原地算法（O(1) 额外空间）展开这棵树吗？

    public static void main(String[] args) {
        TreeNode treeNode = TreeUtils.generateRandomTree();
        flatten(treeNode);
    }

    public static void flatten(TreeNode root) {
        if (root == null) {
            return;
        }

        flatten(root.left);
        flatten(root.right);

        TreeNode right = root.right;
        root.right = root.left;
        root.left = null;

        // 找到最右一个右孩子
        TreeNode cur = root;
        while (cur.right != null) {
            cur = cur.right;
        }

        cur.right = right;
    }
}
